package com.wn.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import com.wn.feign.MemberFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yellow Docter
 * @date 2022 -10-26
 * @desc  测试hystrix 进行服务降级  (业务代码和 服务降级代码分开)
 *   服务降级
 *   1、出现了异常或者调用超时 会调用提前准备好的方法的预定值
 *
 *  解决方案：
 *   1、编写回调类，实现feign接口
 *   2、在feign接口中进行配置
 *     @FeignClient(
 *     value = "cinema-member-service",
 *     fallback = MemberFeignFallback.class)
 *     如果异常进行降级处理的调用

 */
//@RestController
//@RequestMapping("feign")
//@Slf4j
public class FeignController {

    @Autowired
    private MemberFeignClient memberFeignClient;

    /**
     *   如果你的请求都正常,都是正常返回
     *
     *   如果请求失败：
     *   1、打开断路器
     *   2、请求错误率大于 50% 开启熔断器
     *   3、如果在某个时间 10s内 错误率有20 也会开启熔断器
     *   4、熔断器开启多久后进行回复 默认是5
     * @param id
     * @return
     */
//    @GetMapping("find/{id}")
//    // HystrixCommand 服务降级
//    // 方法失败的时候  errorFallback 这方法
//    @HystrixCommand(fallbackMethod = "errorFallback",
//            //熔断配置
//            commandProperties = {
//            // 是否开启断路器
//            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
//            // 请求错误率大于 50% 就启动熔断器
//            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
//            // 默认10秒内访问接口失败达到20次，打开断路器，触发熔断； 为了方便测试，这里修改10秒内错误达到10次触发熔断。
//            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
//            //断路多久以后开始尝试是否恢复，默认5s
//            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
//    })
//    public String findMemberById(@PathVariable("id")Integer id) {
//        if (id<0) {
//            throw new RuntimeException("id不能为负数");
//        }
//        return id + " 调用成功";
//    }
//
//    // 默认降级方法，返回string
//    public String errorFallback(@PathVariable("mid")Integer mid){
//        return "默认降级方法";
//    }

}
